package test_pkg

import "fmt"

//结构体也是值类型，因此可以通过 new 函数来创建
type info struct {
	a int
	b string
}

func Test_struct() {
	//值类型赋值
	t := new(info)
	t.a = 1
	t.b = "aa"
	fmt.Printf("t: %v\n", t)

	//简短的初始化方式 1  混合字面量语法  底层仍然是调用的new(Type) 和 &Type{} 是等价的  值类型赋值
	s := &info{3, "b"}
	fmt.Printf("s: %v\n", s)

	//简短的初始化方式 2 值类型赋值
	s1 := info{5, "c"}       //必须按结构体定义的顺序赋值
	s2 := info{b: "c", a: 5} //可以不按定义顺序
	fmt.Printf("s1: %v\n", s1)
	fmt.Printf("s2: %v\n", s2)

	//指针方式赋值
	s3 := new(info)
	(*s3).b = "cc"
	fmt.Printf("s3: %v\n", s3)
}

//定义工厂方法 禁止外部通过 new 初始化结构图
type config struct {
	name string
}

func NewConfig() *config {
	m := new(config)
	return m
}

// 结构体中的字段除了有名字和类型外，还可以有一个可选的标签（tag）：它是一个附属于字段的字符串，可以是文档或其他的重要标记

type Tag struct {
	name string "tag name" //tag

	// 结构体可以包含一个或多个 匿名（或内嵌）字段，即这些字段没有显式的名字，只有字段的类型是必须的，此时类型就是字段的名字
	int
	config //内嵌结构体
}
